home *** CD-ROM | disk | FTP | other *** search
/ SGI Origin & Onyx2 Patches 1998 May / Origin and Onyx2 System Disk Patches May 1998.img / dist / patchSG0002839.idb / usr / include / sys / msg.h.z / msg.h
C/C++ Source or Header  |  1998-04-01  |  5KB  |  234 lines

  1. /*
  2.  * msg.h --
  3.  *
  4.  *     header for msg(2)
  5.  *
  6.  *
  7.  * Copyright 1990, Silicon Graphics, Inc. 
  8.  * All Rights Reserved.
  9.  *
  10.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  11.  * the contents of this file may not be disclosed to third parties, copied or 
  12.  * duplicated in any form, in whole or in part, without the prior written 
  13.  * permission of Silicon Graphics, Inc.
  14.  *
  15.  * RESTRICTED RIGHTS LEGEND:
  16.  * Use, duplication or disclosure by the Government is subject to restrictions 
  17.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  18.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or 
  19.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - 
  20.  * rights reserved under the Copyright Laws of the United States.
  21.  */
  22. /*    Copyright (c) 1984 AT&T    */
  23. /*      All Rights Reserved      */
  24.  
  25. /*    THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T    */
  26. /*    The copyright notice above does not evidence any       */
  27. /*    actual or intended publication of such source code.    */
  28.  
  29. #ifndef _SYS_MSG_H
  30. #define _SYS_MSG_H
  31.  
  32. #ifdef __cplusplus
  33. extern "C" {
  34. #endif
  35. #include <standards.h>
  36.  
  37. #ident    "$Revision: 3.27 $"
  38.  
  39. /*
  40.  * X/Open XPG4 types.
  41.  */
  42.  
  43. typedef unsigned long    msgqnum_t;
  44. typedef unsigned long    msglen_t;
  45.  
  46. /*
  47. **    IPC Message Facility.
  48. */
  49.  
  50. #include <sys/ipc.h>
  51.  
  52. /*
  53. **    Implementation Constants.
  54. */
  55. #ifdef _KERNEL
  56. #define    PMSG    (PZERO + 2)    /* message facility sleep priority */
  57. #endif /* _KERNEL */
  58.  
  59. /*
  60. **    Permission Definitions.
  61. */
  62.  
  63. #define    MSG_R    0400    /* read permission */
  64. #define    MSG_W    0200    /* write permission */
  65.  
  66. /*
  67. **    Message Operation Flags.
  68. */
  69.  
  70. #define    MSG_NOERROR    010000    /* no error if big message */
  71.  
  72. /*
  73. **    Structure Definitions.
  74. */
  75.  
  76. /*
  77. **    There is one msg queue id data structure for each q in the system.
  78. */
  79.  
  80. struct msqid_ds {
  81.     struct ipc_perm    msg_perm;    /* operation permission struct */
  82.     struct msg    *msg_first;    /* ptr to first message on q */
  83.     struct msg    *msg_last;    /* ptr to last message on q */
  84.     ulong_t        msg_cbytes;    /* current # bytes on q */
  85.     ulong_t        msg_qnum;    /* # of messages on q */
  86.     ulong_t        msg_qbytes;    /* max # of bytes on q */
  87.     pid_t        msg_lspid;    /* pid of last msgsnd */
  88.     pid_t        msg_lrpid;    /* pid of last msgrcv */
  89.     time_t        msg_stime;    /* last msgsnd time */
  90.     long        msg_pad1;    /* reserved for time_t expansion */
  91.     time_t        msg_rtime;    /* last msgrcv time */
  92.     long        msg_pad2;    /* time_t expansion */
  93.     time_t        msg_ctime;    /* last change time */
  94.     long        msg_pad3;    /* last change time */
  95.     long        msg_pad4[4];        /* reserve area */
  96. };
  97.  
  98. /*
  99. **    User message buffer template for msgsnd and msgrecv system calls.
  100. */
  101.  
  102. #if _NO_XOPEN4
  103. struct msgbuf {
  104.     long    mtype;        /* message type */
  105.     char    mtext[1];    /* message text */
  106. };
  107. #endif    /* _NO_XOPEN4 */
  108.  
  109. /*
  110. **    Message information structure.
  111. */
  112.  
  113. struct msginfo {
  114.     int    msgmax,    /* max message size */
  115.         msgmnb,    /* max # bytes on queue */
  116.         msgmni,    /* # of message queue identifiers */
  117.         msgssz,    /* msg segment size (should be word size multiple) */
  118.         msgtql;    /* # of system message headers */
  119.     ushort_t msgseg;    /* # of msg segments (MUST BE < 32768) */
  120. };
  121.  
  122. #ifdef _KERNEL
  123. /*    Each message queue is locked with its own semaphore,
  124. **    and has its own readers/writers waiting semaphore.
  125. **    We cannot add anything to the msqid_ds structure since
  126. **    this is used in user programs and any change would break
  127. **    object file compatibility.  Therefore, we allocate a
  128. **    parallel array, msglock, which contains the message queue
  129. **    locks and semaphores. The array is defined in the msg master
  130. **    file. The following macro takes a pointer to the message
  131. **    queue and returns its corresponding semaphore structure entry.
  132. **/
  133.  
  134. #define    MSGADDR(X)    msgsem[X]
  135.  
  136. struct msgsem {
  137.     mutex_t    msg_lock;    /* lock for msqid_ds structure */
  138.     sv_t    msg_rwait;    /* to wait to read a msg */
  139.     sv_t    msg_wwait;    /* to wait to write a msg */
  140. };
  141.  
  142. /*
  143. **    There is one msg structure for each message that may be in the system.
  144. */
  145.  
  146. struct msg {
  147.     struct msg    *msg_next;    /* ptr to next message on q */
  148.     long        msg_type;    /* message type */
  149.     short        msg_ts;        /* message text size */
  150.     caddr_t        msg_spot;    /* message text map address */
  151. };
  152.  
  153. extern int msgconv(int, struct msqid_ds **);
  154.  
  155. /*
  156.  * Argument vectors for the various flavors of msgsys().
  157.  */
  158.  
  159. #define    MSGGET    0
  160. #define    MSGCTL    1
  161. #define    MSGRCV    2
  162. #define    MSGSND    3
  163.  
  164. struct msgsysa {
  165.     sysarg_t opcode;
  166. };
  167.  
  168. extern int msgsys(struct msgsysa *, union rval *);
  169.  
  170. /*
  171. **    msgget - Msgget system call.
  172. */
  173. struct msggeta {
  174.     sysarg_t opcode;
  175.     sysarg_t key;
  176.     sysarg_t msgflg;
  177. };
  178.  
  179. /*
  180. **    msgctl - Msgctl system call.
  181. */
  182. struct msgctla {
  183.     sysarg_t opcode;
  184.     sysarg_t msgid;
  185.     sysarg_t cmd;
  186.     struct msqid_ds    *buf;
  187. };
  188.  
  189. extern int msgctl(struct msgctla *, union rval *, int);
  190.  
  191. /*
  192. **    msgsnd - Msgsnd system call.
  193. */
  194. struct msgsnda {
  195.     sysarg_t    opcode;
  196.     sysarg_t    msqid;
  197.     struct msgbuf    *msgp;
  198.     sysarg_t    msgsz;
  199.     sysarg_t    msgflg;
  200. };
  201.  
  202. /*
  203. **    msgrcv - Msgrcv system call.
  204. */
  205. struct msgrcva {
  206.     sysarg_t    opcode;
  207.     sysarg_t    msqid;
  208.     struct msgbuf    *msgp;
  209.     sysarg_t    msgsz;
  210.     long        msgtyp;
  211.     sysarg_t    msgflg;
  212. };
  213. #endif /* _KERNEL */
  214.  
  215. #ifndef _KERNEL
  216.  
  217. #if _NO_XOPEN4
  218. extern int    msgctl(int, int, ...);
  219. #else    /* _XOPEN4 */
  220. extern int    msgctl(int, int, struct msqid_ds *);
  221. #endif    /* _NO_XOPEN4 */
  222.  
  223. extern int    msgget(key_t, int);
  224. extern int    msgrcv(int, void *, size_t, long, int);
  225. extern int    msgsnd(int, const void *, size_t, int);
  226.  
  227. #endif /* !_KERNEL */
  228.  
  229. #ifdef __cplusplus
  230. }
  231. #endif
  232.  
  233. #endif /* !_SYS_MSG_H */
  234.